package 曲线多项式;

import org.ejml.simple.SimpleMatrix;
// 四次多项式
public class quartic_polynomial {
    public double startX;  // 初始值x 自变量
    public double startXV; // 初始值x的一阶导 自变量
    public double startXA; // 初始值x的阶二导 自变量
    public double endXV; // 终点值x的一阶导 自变量
    public double endXA; // 终点值x的一阶导 自变量
    public double a0; // 四次多项式的系数
    public double a1;
    public double a2;
    public double a3;
    public double a4;
    public  quartic_polynomial(double startX,double startXV,double startXA,double endXV,double endXA,double T){
        this.startX = startX;
        this.startXV = startXV;
        this.startXA = startXA;
        this.endXV = endXV;
        this.endXA = endXA;
        this.a0 = startX;
        this.a1 = startXV;
        this.a2 = startXA/2.0;
        init(T);
    }
    private void init(double T){
        double[][] A_data = {
                {3 * Math.pow(T, 2),4 * Math.pow(T, 3)},
                {6 * Math.pow(T, 1),12 * Math.pow(T, 2)},
        };
        SimpleMatrix A = new SimpleMatrix(A_data); // 定义矩阵 A
        double[] b_data = {
                this.endXV-this.a1-2*this.a2*T,
                this.endXA-2*this.a2
        };
        SimpleMatrix b = new SimpleMatrix(b_data); // 定义矩阵 B
        // 求解矩阵方程 A * x = b
        SimpleMatrix x = A.solve(b);
        this.a3 = x.get(0,0);
        this.a4 = x.get(1,0);
    }
    public double calc_point(double t){  // 已知自变量t 求四次多项式的 y
        return a0+a1*t+a2*Math.pow(t,2)+a3*Math.pow(t,3)+a4*Math.pow(t,4);
    }
    public double calc_first_derivative(double t){ // 一阶导
        return a1 + 2*a2*t + 3*a3*Math.pow(t,2) + 4*a4*Math.pow(t,3);
    }
    public double calc_second_derivative(double t){ // 二阶导数
        return 2*a2 + 6*a3*t + 12*a4*Math.pow(t,2);
    }
    public double calc_third_derivative(double t){ // 三阶导数
        return 6*a3 + 24*a4*t;
    }
}
